﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Novapangeia.Dominio;
using Novapangeia.RepositorioNHibernate;
using SharpArch.Data.NHibernate;

namespace Novapangeia.Negocio
{
    public class Combate
    {
        private Usuario UsuarioAtacante{get;set;}
        private Usuario UsuarioDefensor { get; set; }
        private Tropa TropaAtacante { get; set; }
        private Tropa TropaDefensora { get; set; }
        private List<Unidade> UnidadesEngajadas { get; set; }

        private int TropaVencedoraId { get; set; }
        private string relatorioHTML { get; set; }
        private string relatorioXML { get; set; }

        public Combate(int tropaAtacanteId, int UsuarioDefensorID) 
        {
            RepositorioTropa repTropa = new RepositorioTropa();
            RepositorioUsuario repUsuario = new RepositorioUsuario();
            TropaAtacante = repTropa.Get(tropaAtacanteId);
            UsuarioAtacante = TropaAtacante.Usuario;
            UsuarioDefensor = repUsuario.Get(UsuarioDefensorID);
            TropaDefensora = UsuarioDefensor.tropas.FirstOrDefault(t => t.Guarda == true);

            UnidadesEngajadas = new List<Unidade>();
            UnidadesEngajadas.AddRange(TropaAtacante.Unidades);
            UnidadesEngajadas.AddRange(TropaDefensora.Unidades);
            UnidadesEngajadas = UnidadesEngajadas.OrderBy(u => u.tipo.Iniciativa).ToList();

            ProcessarCombate();
        }

        public void ProcessarCombate()
        {
            while (!combateFinalizado()) 
            {
                foreach (Unidade unidadeAtacando in UnidadesEngajadas) 
                {
                    if (unidadeAtacando.Quantidade > 0) 
                    {
                        Unidade unidadeAlvo = UnidadesEngajadas.FirstOrDefault(unidadeInimiga => unidadeInimiga.Tropa.Id != unidadeAtacando.Tropa.Id && unidadeInimiga.Quantidade > 0);
                        int baixas = unidadeAtacando.CalcularAtaque(unidadeAlvo);
                        unidadeAlvo.Quantidade -= baixas;
                        //logar no xml e/ou no html....
                    }
                }
            }
            // salvar o xml em um novo arquivo na pasta do servidor
            // salvar o html nos relatorios dos jogadores
        }

        public bool combateFinalizado() 
        {
            if (tropaVazia(TropaAtacante)) 
            {
                //o defensor venceu
                TropaVencedoraId = TropaDefensora.Id;
                //registrar que não houve saque
                //logar o vencedor no xml e/ou no html
                return true;
            }
            else if (tropaVazia(TropaDefensora)) 
            {
                //o atacante venceu
                TropaVencedoraId = TropaAtacante.Id;
                Saquear();
                //logar o vencedor no xml e/ou no html
                return true;
            }
            return false;
        }

        public bool tropaVazia(Tropa t)
        {
            int unidadesRemanescentes = 0;
            List<Unidade> unidadesEngajadasNestaTropa = UnidadesEngajadas.Where(und => und.Tropa.Id == t.Id).ToList();
            foreach (Unidade unidade in unidadesEngajadasNestaTropa)
            {
                unidadesRemanescentes += unidade.Quantidade;
            }
            return unidadesRemanescentes <= 0;
        }

        public void Saquear()
        {
            //em caso de vitoria da tropa atacante
            //calcular o saque com baser em:
            // -> unidades restantes do atacante vitorioso
            // -> estoque remanescente do defensor derrotado
            // descontar o saque do defensor derrotado
            // adicionar o saque ao atacante vencedor
            //registrar no log xml e no log html
        }
    }
}
